﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace SistemaCenterQuimPost.UI.PostCajero
{
    public partial class frmMovimientosCliente : SistemaCenterQuimPost.UI.PostCajero.frmGestionClientes
    {
        //-------------------ATRIBUTOS---------------------
        private DataSet3TableAdapters.MovimientosTableAdapter movimientosClientesTa;


        //------------------CONSTRUCTORES-----------------
        public frmMovimientosCliente()
        {
            InitializeComponent();

            movimientosClientesTa = new DataSet3TableAdapters.MovimientosTableAdapter();

            removerControles();  //se remueve los controles heredados que no necesitamos en esta interface, por diseño no se puede

            posicionarListBox(); //se posiciona los listBox, porque por herencia en el diseño no se puede.

            this.vaciarTextBox(); //deja vacio los campos para cargar nuevos datos.
        }
        //--------------------ESTADOS----------------------
        protected override void estEsperandoOperacion() //estado luego de realizar una busqueda exitosa, agregar o editar. Es decir con datos en vista.
        {
            System.Windows.Forms.Control[] controlesHabilitados = { this.txtDni, this.btnBusDni, this.txtApellido, this.btnBusApellido, this.btnAgregar };
            System.Windows.Forms.Control[] controlesDeshabilitados = { this.txtNombre, this.txtCuit, this.txtProvincia, this.txtLocalidad, this.txtDireccion, this.txtTel, this.txtCel, this.txtEmail, this.txtDescuento, this.btnEditar };
            System.Windows.Forms.Control[] controlesVisibles = { };
            System.Windows.Forms.Control[] controlesInvisibles = { lstClientesApellidoNombre, this.lblErrorDni, this.lblErrorApellido, this.lblErrorNombre, this.lblErrorDireccion, lblError };

            habilitarControles(controlesHabilitados);
            deshabilitarControles(controlesDeshabilitados);
            visibleControles(controlesVisibles);
            invisibleControles(controlesInvisibles);

            if (refrescarResgClientes) //si hace falta actualizar el refrescarResgClientes se realiza
            {
                ejecutarHiloActualizarResgClientes();

            }

            errorProvider1.Clear();  //se borran los errores, si habian.

            txtDni.Focus();   //se deja el foco en txtDni

            estadoDelFormulario = "estEsperandoOperacion";

        }

        //-------------------METODOS VARIOS---------------
        private void removerControles()   //Eliminar los controles que heredé pero que no los voy a usar.
        {
            this.Controls.Remove(this.groupBox2);
            this.Controls.Remove(this.groupBox3);
            this.Controls.Remove(this.lblErrorDni);
            this.Controls.Remove(this.lblErrorApellido);
            this.Controls.Remove(this.lblNombre);
            this.Controls.Remove(this.txtNombre);
            this.Controls.Remove(this.lblErrorNombre);
            this.Controls.Remove(this.lblCuit);
            this.Controls.Remove(this.txtCuit);
            this.Controls.Remove(this.lblProvincia);
            this.Controls.Remove(this.txtProvincia);
            this.Controls.Remove(this.lblLocalidad);
            this.Controls.Remove(this.txtLocalidad);
            this.Controls.Remove(this.lblDireccion);
            this.Controls.Remove(this.txtDireccion);
            this.Controls.Remove(this.lblErrorDireccion);
            this.Controls.Remove(this.lblTel);
            this.Controls.Remove(this.txtTel);
            this.Controls.Remove(this.lblCel);
            this.Controls.Remove(this.txtCel);
            this.Controls.Remove(this.lblEmail);
            this.Controls.Remove(this.txtEmail);
            this.Controls.Remove(this.lblDescuento);
            this.Controls.Remove(this.txtDescuento);
            this.Controls.Remove(this.btnAgregar);
            this.Controls.Remove(this.btnEditar);
            this.Controls.Remove(this.lblAgregar);
            this.Controls.Remove(this.lblEditar);
            this.Controls.Remove(this.btnProcesar);

        }

        private void posicionarListBox()  //usado para colocar a los lstBox en su lugar, ya que por herencia en t.Diseño no se puede.
        {
            lstClientesApellidoNombre.Location = new Point(256, 126);

        }

        protected override void resguardarClienteActual() //Guarda los valores de los textBox en array resgClienteActual, luego de una busqueda exitosa.
        {

        }

        protected override void deshacerCambios()  //usado cuando en estado editar o agregar, se arrepiente (no se apreta en procesar) y se vuelve a estado esperandoOperacion.
        {

        }

        protected override void vaciarTextBox() //Se deja en blanco todos los textBox, usado en estado cuando inicia el formulario y cuando termina de procesar algo.
        {

            txtDni.Text = "";
            txtApellido.Text = "";
            this.lblDniValor.Text = "";
            this.lblApellidoNombreValor.Text = "";
            this.lblDireccionValor.Text = "";
            this.lblSaldoValor.Text = "";
            this.dgvMovimientos.Rows.Clear(); //vaciamos la grilla de moviminetos

        }

        protected override void cargarClientePorDni(string unDni) //busca cliente con dni (una coincidencia) encontrado en el oHiloFiltrarDni y lo carga en los textBox.
        {
            if (AccesoInternet())
            {
                try
                {
                    //(ALE)HACER EL FILL O COMO LO LLAMES ACA ABAJO
                    //clientesTa.FillByClientes(centerQuimDs,unDni);
                    clientesTa.FillByDni(clientesDs.Clientes, unDni);

                    //ARREGLAR ESTO. Se rellena los textBox con la consulta encontrada.
                    lblDniValor.Text = clientesDs.Clientes[0].dni;

                    lblApellidoNombreValor.Text = clientesDs.Clientes[0].apellidoyNombre;
                    lblDireccionValor.Text = clientesDs.Clientes[0].direccion;
                    lblSaldoValor.Text = clientesDs.Clientes[0].saldo.ToString();

                    //...
                    //..FALTAN LOS OTROS. ACORDATE QUE ESTE ES EL DE CAJERO, TIENE POCOS CONTROLES.
                    procesar();

                }
                catch (IndexOutOfRangeException)
                {

                }
                catch (Exception ex)
                {
                    //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                    MessageBox.Show("La conexión a la base de datos no fué exitosa.\n\n Comuniquese con su desarrollador para solucionar el problema.\n\n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    //Si llega a ocurrir algún error grave se cierra el formulario 
                    this.Close();
                }    
            }
            else
            {
                if (!AccesoInternet())
                {
                    MessageBox.Show("Esta operación necesita conexión a internet.", "INFORME", MessageBoxButtons.OK, MessageBoxIcon.Information);

                }
            }
            
            
        }

        protected override void cargarClientesPorApellidoNombre(string unApellidoNombre)  //busca el cliente por nombreApellido en la base de datos y lo carga en los textbox.
        {
            if (AccesoInternet())
            {
                //(ALE) HACER EL FILL O COMO LO LLAMES ACA ABAJO
                clientesTa.FillByApellidoNombre(clientesDs.Clientes, unApellidoNombre);

                //ARREGLAR ESTO. Se rellena los textBox con la consulta encontrada.
                lblDniValor.Text = clientesDs.Clientes[0].dni;

                lblApellidoNombreValor.Text = clientesDs.Clientes[0].apellidoyNombre;
                lblDireccionValor.Text = clientesDs.Clientes[0].direccion;
                lblSaldoValor.Text = clientesDs.Clientes[0].saldo.ToString();

                //...
                //..FALTAN LOS OTROS. ACORDATE QUE ESTE ES EL DE CAJERO, TIENE POCOS CONTROLES.
                procesar(); //
            }
            else
            {
                if (!AccesoInternet())
                {
                    MessageBox.Show("Esta operación necesita conexión a internet.", "INFORME", MessageBoxButtons.OK, MessageBoxIcon.Information);

                }
            }
            
            

        }

        //Se redefine el comportamiento de este boton
        protected override void procesar() //se encapsulo en un método para usar cuando se presiona Enter con los textBox
        {
                
            try
                {
                    movimientosClientesTa.FillByDni(clientesDs.Movimientos,lblDniValor.Text);

                    if (clientesDs.Movimientos.Rows.Count == 0)
                    {
                        //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                        MessageBox.Show("No existen movimientos para el cliente especificado.", "MOVIMIENTOS DE CLIENTES", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        
                        vaciarTextBox();

                    }else

                    {
                        dgvMovimientos.Rows.Clear();
                        for (int i = 0; i < clientesDs.Movimientos.Rows.Count; i++)//cargamos a la grilla
                        {

                            dgvMovimientos.Rows.Add(clientesDs.Movimientos[i].fecha.ToString("d"), clientesDs.Movimientos[i].concepto, clientesDs.Movimientos[i].tipoMov, clientesDs.Movimientos[i].importe);

                        }
                    }
                    
                }

                    
                catch (IndexOutOfRangeException)
                {
                    //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                    MessageBox.Show("No existen movimientos para el cliente especificado.", "MOVIMIENTOS DE CLIENTES", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    vaciarTextBox();
                }
                catch (Exception ex)
                {
                    //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                    MessageBox.Show("La conexión a la base de datos no fué exitosa.\n\n Comuniquese con su desarrollador para solucionar el problema.\n\n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    //Si llega a ocurrir algún error en estado agregar 
                    this.Close();
                }


        }

    }
}
